package com.ncmmall.domain.business.order;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ncmmall.domain.business.distribution.Distributor;
import com.ncmmall.domain.business.live.LiveSession;
import com.ncmmall.domain.business.marketing.coupon.Coupon;
import com.ncmmall.domain.business.marketing.gift.GiftActivity;
import com.ncmmall.domain.business.marketing.shoppingcard.ShoppingCardRecord;
import com.ncmmall.domain.security.user.WebUser;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

/**
 * @author linxs
 * @Description: 商城商品订单
 * @Date: 2019-07-15 17:32
 */
@Entity
@Table(name = "mall_order")
@Access(AccessType.FIELD)
@Getter
@Setter
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    /**
     * 所属会员
     */
    @JsonBackReference
    @OneToOne
    private WebUser member;

    /**
     * 所属商家
     */
    @JsonBackReference
    @OneToOne
    private WebUser merchant;

    /**
     * 所属供应商（一件代发订单使用）
     */
    @JsonBackReference
    @OneToOne
    private WebUser supplier;

    /**
     * 订单编号
     */
    private String orderNo;

    /**
     * 下单时间
     */
    private Timestamp createTime;

    /**
     * 订单总价(商品小计 + 运费 - 优惠券)
     */
    private double price;

    /**
     * 运费
     */
    private double freightPrice;

    /**
     * 配送方式
     * 1、快递
     * 2、自提
     */
    private int shippingMethod;

    /**
     * 配送数量方式
     * 1、全部发货
     * 2、按需发货
     */
    private int deliveryType;

    /**
     * 自提地址
     */
    private String shippingAddress;

    /**
     * 商品小计价格
     */
    private double goodsSubtotalPrice;

    /**
     * 需支付的金额 (订单总价 - 购物卡金额)
     */
    private double money;

    /**
     * 商品数量
     */
    private int goodsQuantity;

    /**
     * 是否供应商订单
     * 1、是
     */
    private int isSupplier;

    /**
     * 是否一件代发订单
     * 1、是
     */
    private int isIssuingType;

    /**
     * 订单状态
     * 1、提交订单（待付款）
     * 2、付款成功（待发货）
     * 3、商品出库（待收货）
     * 4、订单签收（待评价）
     * 5、交易完成
     * 6、订单取消
     * 7、预售订单已支付定金
     * 8、预售订单待支付尾款
     * 9、采购端线下转账-待审核
     * 10、商品按需出库（待部分收货）
     */
    private int status;

    /**
     * 活动订单类型
     * 0、普通订单
     * 1、赠品活动订单
     * 2、拼团活动订单
     * 3、特价活动订单
     * 4、秒杀活动订单
     * 5、预售活动订单
     */
    private int marketingType;

    /**
     * 定金（预售订单）
     */
    private double prepaidDepositPrice;

    /**
     * 尾款（预售订单）+ 运费
     */
    private double finalPaymentPrice;

    /**
     * 赠品活动
     */
    @OneToOne
    private GiftActivity giftActivity;

    /**
     * 是否售后
     * 1、是
     */
    private int isAfterSale;

    /**
     * 支付状态
     * 1、支付成功
     * 2、未支付
     * 3、预售订单订金已支付
     */
    private int payStatus;

    /**
     * 完成支付时间
     */
    private Timestamp payTime;

    /**
     * 确认收货时间
     */
    private Timestamp receiptTime;

    /**
     * 支付方式
     * 1、微信支付
     * 2、支付宝支付
     * 3、余额组合微信支付
     * 4、购物卡支付
     * 5、线下转账（采购端）
     * 6、余额全额支付
     */
    private int payMethod;

    /**
     * 是否是app端支付，退款不同渠道
     */
    private int appPay;

    /**
     * 是否使用钱包余额抵扣
     * 1、是
     */
    private int isBlanceOrder;

    /**
     * 使用余额抵扣的金额
     */
    private double blancePrice;

    /**
     * 支付流水号
     */
    private String payNo;

    /**
     * 预售订金支付流水号
     */
    private String presellSubscriptionPayNo;

    /**
     * 预售尾款支付流水号
     */
    private String presellRetainagePayNo;

    /**
     * 预售订金支付时间
     */
    private Timestamp presellSubscriptionPayTime;

    /**
     * 预售尾款支付时间
     */
    private Timestamp presellRetainagePayTime;


    /**
     * 收货人
     */
    private String deliveryName;

    /**
     * 收货省份
     */
    private String deliveryProvince;

    /**
     * 收货城市
     */
    private String deliveryCity;

    /**
     * 收货区/县
     */
    private String deliveryArea;

    /**
     * 收货地址
     */
    private String deliveryAddress;

    /**
     * 收货人电话
     */
    private String deliveryMobile;

    /**
     * 物流状态
     */
    private int expressStatus;

    /**
     * 物流公司
     */
    private String expressCompany;

    /**
     * 物流公司编号
     */
    private String expressCode;

    /**
     * 快递单号
     */
    private String expressesNo;

    /**
     * 备注
     */
    private String note;

    /**
     * 订单详情集合
     */
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "order_id")
    private List<OrderDetail> details = Lists.newArrayList();

    /**
     * 成交时间
     */
    private Timestamp finishTime;

    /**
     * 取消时间
     */
    private Timestamp cancelTime;

    /**
     * 发货时间
     */
    private Timestamp deliveryTime;

    /**
     * 取消原因
     */
    private String cancelNote;

    /**
     * 自动取消时间（下单后1小时未支付即取消）
     */
    private Timestamp autoCancelTime;

    /**
     * 发票类型
     * 1、普票
     * 2、专票
     */
    private int invoiceType;

    /**
     * 是否开具发票
     * 1、不开发票
     * 2、开具发票
     */
    private int haveInvoice;

    /**
     * 发票抬头类型
     * 1、企业
     * 2、个人
     */
    private int invoiceTitleType;

    /**
     * 发票抬头
     */
    private String invoiceTitle;

    /**
     * 发票税号
     */
    private String invoiceTFN;

    /**
     * 是否使用了优惠券
     * 1、是
     */
    private int haveCoupon;

    /**
     * 是否使用了购物卡
     * 1、是
     */
    private int havaShoppingCardRecord;

    /**
     * 使用的购物卡
     */
    @OneToOne
    private ShoppingCardRecord shoppingCardRecord;

    /**
     * 购物卡抵扣的金额
     */
    private double shoppingCardMoney;

    /**
     * 使用的优惠券
     */
    @OneToOne
    private Coupon coupon;


    /**
     * 供应商银行名称
     */
    private String supplierBankName;

    /**
     * 供应商银行户名
     */
    private String supplierBankAccountHolder;

    /**
     * 供应商银行卡号
     */
    private String supplierBankCardNo;


    /**
     * 线下转账凭证图片
     */
    private String bankCardPayPhoto;

    /**
     * 线下转账凭证备注文字
     */
    private String bankCardPayNote;

    /**
     * 是否云仓发货
     * 1、是
     */
    private int isCloudStoreDelivery;

    /**
     * 是否是申请成为分销商的订单
     * 1, 2, 3, 4, 5 分销商等级
     */
    private Integer applyDistributor;

    /**
     * 是否是分销商订单
     * 1、是
     */
    private Integer distributionOrder;

    /**
     * 在哪个直播间购买的商品，直播订单
     */
    @OneToOne
    @JoinColumn(name = "live_session_id")
    @JsonIgnore
    private LiveSession liveSession;

    /**
     * 分销来源
     * 1、商品分享
     * 2、微店购买
     * 3、商城购买
     */
    private Integer distributorSource;

    /**
     * 购买了哪个分销商的商品
     */
    @OneToOne
    @JsonIgnore
    private Distributor distributor;

    /**
     * 分销金额
     */
    private Double distributionPrice;

    /**
     * 直播分销金额
     */
    private Double livePrice;

    /**
     * 按金额排序
     */
    @Transient
    private String orderByPrice;

    /**
     * 按时间排序
     */
    @Transient
    private String orderByCreateTime;

    @Transient
    private Timestamp currentTime;

    @Transient
    private long orderAfterSaleId;

    @Transient
    private Map<String, Object> merchantInfo;

    @Transient
    private String beginTime;

    @Transient
    private String endTime;

    /**
     * 临时字段
     */
    @Transient
    private String data;

    /**
     * 预售商品尾款开始支付时间
     */
    @Transient
    private String presellRetainagePayBeginTime;

    /**
     * 发货数量
     */
    @Transient
    private int deliveryCount;

    /**
     * 云仓存放数量
     */
    @Transient
    private int cloudCount;

}
